3、测试驱动程序
切换到DriverMonitor,我们可以找到“Message text”列中有以“HelloWdm:”开始的字符串,这是驱动程序发出的调试信息,如下图所示:

下面我们用HelloWdm实例中自带的测试程序进行测试。切换到VC6,选择菜单“Project”->“Set Active Project”->“Hello App”,如下图所示:

编译测试程序:选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(如果编译不成功,确认是否配置好“DDK Build Settings”

运行测试程序:按Ctrl+F5,将弹出基于命令行模式的测试程序,如下图所示:

切换到DriverMonitor,我们发现驱动程序又发出了三条调试信息,如下图所示:

大家可以分析这个驱动程序的结构,不过您如果不是专业驱动开发人员的话,建议不要探索的过深,因为Windows设备驱动程序太过于庞大和复杂了,我自已也只是略懂一点点皮毛^_^。
4、小试身手
一般Hello World类程序都会输出一个“Hello World”字符串,但Hello Wdm却没有,下面我们来修改一下这个驱动程序,让它变更生动一点,也输出一个“Hello Wdm”字符串。我们来实现这样一个功能:向设备写入字符串“Hello Wdm!!!”,然后设备再将收到的字符串“显示”出来。Windows系统中一般通过调用WriteFile来向设备写入数据,通过“基础知识”一节,我们知道调用WriteFile时最终会转化为对驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程的调用,下面我们来增加驱动程序IRP_MJ_WRITE功能代码所对应的 Dispatch例程。
通过查看DriverWorks的帮助文档,得知实现IRP_MJ_WRITE的功能函数原型为KDevice::Write,我们来继承它。
1)在HelloDev.h中找到以下内容:
- virtual NTSTATUS Create(KIrp I);
- virtual NTSTATUS Close(KIrp I);
- virtual NTSTATUS DeviceControl(KIrp I);
- virtual NTSTATUS SystemControl(KIrp I);
在后面加入:
-
- virtual NTSTATUS Write(KIrp I);
-
2)还要在function.h中加入
-
- #define DRIVER_FUNCTION_WRITE
-
3)在HelloDev.c中实例化Write功能函数,加入的内容如下:
-
-
-
- NTSTATUS SimpleWdmDevice::Write(KIrp I)
- {
- NTSTATUS status = STATUS_SUCCESS;
-
- T << "entered the write handler\n";
-
- PUCHAR pBuffer = (PUCHAR) I.UserBuffer();
-
- DbgPrint("%s",pBuffer);
-
- return I.PnpComplete(this, status);
- }
-
4)选择菜单“Build”->“Batch Build”编译驱动程序,然后重新安装编译好的驱动程序。
5)在HelloApp.cpp中定位到main函数,找到下面语句
在前面加入以下这段代码:
-
- BOOL bWriteSuccess;
- DWORD dwByteWrite;
-
- bWriteSuccess = WriteFile(hHello,("Hello Wdm!!!\n"),
- sizeof(("Hello Wdm!!!\n")),&dwByteWrite,NULL);
-
- if(bWriteSuccess)
- {
- cout << "WriteFile operation ok\n";
- }
- else
- {
- cout << "WriteFile operation failed, code=" << GetLastError() << endl;
- }
-
6)选择菜单“Build”->“Batch Build”,编译驱动程序,然后重新安装驱动程序。
7) 选择菜单“DriverStudio”->“Build with BUILD.EXE”进行编译(编译前确认是否配置好“DDK Build Settings”),然后执行编译后的测试程序,我们可以看到运行后的结果,如下图所示:

测试程序的运行结果

DriverMonitor监测到调试信息
下载编译好的驱动
下载测试程序(需要在命令行模式运行程序,否则窗口一闪而过,看不到运行结果)
下载源代码